/**
 * @author 秋落风声
 * @date 2024-8-4
 * @version 1.0
 * @Email: furina.see.fun@gmail.com or 907741673@qq.com
 */
#ifndef HASHTABLE_H
#include <stdio.h>
#include<stdbool.h>
#define DEFAULT_TableSize 31//哈希表默认大小
#define DEFAULT_LOADFACTOR 0.75//默认负载因子
typedef struct Pair{
    char *key;
    char *value;
    // //分离链接法---单链表作为基本结构
    // Pair *next;---此版本不解决冲突.
} Pair;
typedef struct Hash_Table{
    Pair **buckets;//哈希数组
    int tableSize;//哈希数组的大小
    int count;//记录当前填入哈希表的元素个数
    //析构方法
    int (*destroy)(struct Hash_Table *self);
    //简单测试方法
    bool (*isEmpty)(struct Hash_Table *self);
    int (*print)(struct Hash_Table *self);
    //核心方法
    int (*put)(struct Hash_Table *self, const char *key, const char *value);
    int (*search)(struct Hash_Table *self, const char *key,char **resultVal);
    int (*remove)(struct Hash_Table *self, const char *key);
    int (*getfactor)(struct Hash_Table *self, double *resultFactor);
    int (*getVal)(struct Hash_Table *self, const char *key,char **resultVal);
    int (*setVal)(struct Hash_Table *self, const char *key,const char *setValue);
    int (*getAllKey)(struct Hash_Table *self, char ***resultKeyArray,size_t *returnSize);
    int (*getAllVal)(struct Hash_Table *self, char ***resultValArray,size_t *returnSize);
    int (*getAllPair)(struct Hash_Table *self, Pair ***resultPairArray,size_t *returnSize);
} Hash_Table;

//初始化哈希表
int HashInit(Hash_Table *ht,int size);
Hash_Table *newHash_Table(int size);
//析构函数
int del_hash_table(Hash_Table *ht);
//基本操作
//判空
bool isEmpty_hash(Hash_Table *ht);
//获取负载因子
int get_load_factor(Hash_Table *ht, double *resultFactor);
int insert_hash(Hash_Table *ht, const char *key, const char *value);
int search_hash(Hash_Table *ht, const char *key,char **resultVal);
int delete_hash(Hash_Table *ht, const char *key);
int get_one_value(Hash_Table *ht, const char *key,char **resultVal);
int set_one_value(Hash_Table *ht, const char *key,const char *setValue);
int get_all_key(Hash_Table *ht, char ***resultKeyArray,size_t *returnSize);
int get_all_value(Hash_Table *ht, char ***resultValueArray,size_t *returnSize);
int get_all_pair(Hash_Table *ht, Pair ***resultPairArray,size_t *returnSize);
int print_hash(Hash_Table *ht);//打印哈希表.
#endif